iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
Software Development

深入淺出Java 30天系列 第 30

Day 30: 優先使用list而不是array(下)

  • 分享至 

  • xImage
  •  

昨天說明為什麼最好優先使用list,看起來list似乎是因為可以使用泛型,享受到泛型的優點,所以才鼓勵優先使用list,那麼array是否也可以使用或混用泛型,享受這些好處呢?

array能不能使用泛型?

直接用list建立泛型array,但是這樣會遇到compile錯誤,compiler會跳出generic array creation

import java.util.List;

public class GenericArray {
    // 嘗試創建一個 List<String>[] 陣列
    List<String>[] listArray = new List<String>[10]; // 這行會編譯錯誤
}


假如還是很堅持這麼做,可以透過把raw type的list array,強制轉型成泛型array。

import java.util.ArrayList;
import java.util.List;

public class GenericArray {
    public static void main(String[] args) {
        // 如果你設法繞過編譯錯誤(例如使用強制轉型)
        List<String>[] listArray = (List<String>[]) new List[10];

        // 嘗試將 List<String> 添加到陣列中
        listArray[0] = new ArrayList<String>();
        listArray[0].add("Hello");

        // 嘗試將一個不正確的類型放入陣列中(這樣做是錯誤的)
        List<Integer> intList = new ArrayList<>();
        intList.add(123);
        Object[] objectArray = listArray; // 將 listArray 視為 Object[] 型別
        objectArray[1] = intList; // 這行不會拋出錯誤,因為 objectArray 是 Object[]

        // 這會導致運行時的 ClassCastException
        String s = listArray[1].get(0); // 嘗試取得 listArray[1] 的第一個元素
    }
}

結果這個被強加的泛型,仍然保留了array的缺點,型別錯誤時,一樣在runtime的時候才跳出java.lang.ClassCastException,引發潛在的型別安全問題,反而失去了泛型在compile time檢查出型別錯誤的優點。


第一次參加鐵人賽就順利完成30天的挑戰,感謝自己沒有半途而廢QAQ下班就算再累也要看書寫心得,完成鐵人賽的挑戰XDDD 不過這不是終點,effective java還沒有結束,之後會繼續在medium上更新Effective Java Note,歡迎大家來看看XDD另外,之後還會開一場探索亞馬遜雨林30天,還沒正式開始,也歡迎之後大家來捧場XDDD


上一篇
Day 29: 優先使用list而不是array(上)
系列文
深入淺出Java 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言